import js from '@eslint/js'
import { defineConfig } from 'eslint/config'
import importPlugin from 'eslint-plugin-import'
import pluginVue from 'eslint-plugin-vue'
import globals from 'globals'
export default defineConfig([
  // 添加忽略文件
  {
    ignores: ['**/node_modules/**', '**/dist/**', '**/dist/*', '**/build/**']
  },
  {
    files: ['**/*.{js,mjs,cjs,vue}'],
    plugins: {
      js,
      import: importPlugin
    },
    extends: ['js/recommended'],
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node
      }
    },
    settings: {
      'import/resolver': {
        node: {
          extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue']
        }
      }
    },
    // "off" 或 0 - 关闭规则
    // "warn" 或 1 - 开启规则，使用警告级别的错误：warn (不会导致程序退出)
    // "error" 或 2 - 开启规则，使用错误级别的错误：error (当被触发的时候，程序会退出)
    rules: {
      // 要求switch语句中有default分支
      'default-case': 2,
      // 要求使用===和!==而不是==和!=
      eqeqeq: 2,
      // 禁止使用alert、confirm和prompt
      'no-alert': 1,
      // 禁用arguments.caller或arguments.callee
      'no-caller': 2,
      // 禁止与null进行比较
      'no-eq-null': 2,
      //禁止省略浮点数中的0 .5 3.
      'no-floating-decimal': 2,
      // 禁止对原生对象或只读的全局对象进行赋值
      'no-global-assign': 2,
      // 禁用不必要的嵌套块
      'no-lone-blocks': 2,
      // 禁止使用多行字符串
      'no-multi-str': 2,
      // 禁止重复声明变量
      'no-redeclare': 2,
      // 禁止自我赋值
      'no-self-assign': 2,
      // 禁止自身比较
      'no-self-compare': 2,
      // 禁用逗号操作符
      'no-sequences': 2,
      // 禁止不必要的转义字符
      'no-useless-escape': 2,
      // 要求IIFE使用括号括起来
      'wrap-iife': [2, 'any'],
      // 禁用未声明的变量，除非它们在/*global */注释中被提到
      'no-undef': 2,
      // 禁止将变量初始化为undefined
      'no-undef-init': 2,
      // 禁止出现未使用过的变量
      'no-unused-vars': [2, { vars: 'all', args: 'none' }],
      // 不允许在变量定义之前使用它们
      'no-use-before-define': 1,
      // 强制在数组方括号中使用一致的空格
      'array-bracket-spacing': [2, 'never'],
      // 强制在代码块中使用一致的空格
      'block-spacing': [2, 'never'],
      // 强制使用一致的括号风格
      'brace-style': [2, '1tbs', { allowSingleLine: true }],
      // 强制使用驼峰命名法
      camelcase: 0,
      // 强制不必要的逗号
      'comma-dangle': ['error', 'never'],
      // 强制使用一致的逗号风格
      'comma-style': [2, 'last'],
      // 强制在计算的属性的方括号中使用一致的空格
      'computed-property-spacing': [2, 'never'],
      // 强制在文件末尾至少保留一行空行
      'eol-last': 2,
      // 强制使用一致的缩进
      indent: [2, 2, { SwitchCase: 1 }],
      // 强制在对象字面量的键和值之间使用一致的间距
      'key-spacing': [2, { beforeColon: false, afterColon: true }],
      // 禁止行尾空格
      'no-trailing-spaces': 2,
      // 禁止可以在有更简单的可替代的表达式时使用字面量值
      'no-unneeded-ternary': 2,
      // 强制在对象字面量的属性中键和值之间使用一致的间距
      'object-curly-spacing': [2, 'always'],
      // 强制使用一致的反勾号、双引号或单引号
      quotes: [2, 'single'],
      // 要求或禁止使用分号而不是ASI
      semi: [2, 'never'],
      // 强制分号之前的空格
      'semi-spacing': [2, { before: false, after: true }],
      // 强制在块之前使用一致的空格
      'space-before-blocks': [2, 'always'],
      // 强制在function的左括号之前使用一致的空格
      'space-before-function-paren': [2, 'never'],
      // 强制在圆括号内使用一致的空格
      'space-in-parens': [2, 'never'],
      // 要求操作符周围有空格
      'space-infix-ops': 2,
      // 强制在一元操作符前后是否需要加空格
      'space-unary-ops': [2, { words: true, nonwords: false }],
      // 强制箭头函数的箭头前后使用一致的空格
      'arrow-spacing': [2, { before: true, after: true }],
      // 禁止修改类声明的变量
      'no-class-assign': 2,
      // 禁止修改const声明的变量
      'no-const-assign': 2,
      // 禁止类成员中出现重复的名称
      'no-dupe-class-members': 2,
      // 禁止重复模块导入
      'no-duplicate-imports': 2,
      //空行最多不能超过1行
      'no-multiple-empty-lines': [1, { max: 1 }],
      // 禁止在构造函数中，在调用super()之前使用this或super
      'no-this-before-super': 2,
      // 禁止在对象中使用不必要的计算属性
      'no-useless-computed-key': 2,
      // 禁止在import和export和解构赋值时将引用重命名为相同的名字
      'no-useless-rename': 2,
      // 要求使用let或const而不是var
      'no-var': 2,
      // 要求对象字面量中方法和属性使用简写语法
      'object-shorthand': 2,
      // 要求回调函数使用箭头函数
      'prefer-arrow-callback': 2,
      // 要求使用const声明那些声明后不再被修改的变量
      'prefer-const': 2,
      // 要求使用模板字面量而非字符串连接
      'prefer-template': 2,
      // 强制剩余和扩展运算符及其表达式之间有空格
      'rest-spread-spacing': [2, 'never'],
      // 要求或禁止模板字符串中的嵌入表达式周围空格的使用
      'template-curly-spacing': [2, 'never'],
      // 禁止在模板中使用多个空格
      'vue/no-multi-spaces': 2,
      // 禁止在属性中的等号周围有空格
      'vue/no-spaces-around-equal-signs-in-attribute': 2,
      // 禁止在模板中使用v-html以防止XSS攻击
      'vue/no-v-html': 0,
      // 强制在属性中使用引号
      'vue/html-quotes': [2, 'double'],
      // 强制组件的命名风格
      'vue/multi-word-component-names': 0,
      // 强制自闭合标签的风格
      'vue/html-self-closing': [
        2,
        {
          html: {
            void: 'never',
            normal: 'always',
            component: 'always'
          },
          svg: 'always',
          math: 'always'
        }
      ],
      // 强制缩进
      'vue/html-indent': [2, 2],
      // 强制属性顺序
      'vue/attributes-order': [
        2,
        {
          order: [
            'DEFINITION',
            'LIST_RENDERING',
            'CONDITIONALS',
            'RENDER_MODIFIERS',
            'GLOBAL',
            ['UNIQUE', 'SLOT'],
            'TWO_WAY_BINDING',
            'OTHER_DIRECTIVES',
            'OTHER_ATTR',
            'EVENTS',
            'CONTENT'
          ],
          alphabetical: false
        }
      ],
      // 添加导入顺序规则
      'import/order': [
        'error',
        {
          groups: [
            'builtin',      // Node.js 内置模块
            'external',     // npm 包
            'internal',     // 项目内部模块
            'parent',       // 父目录导入
            'sibling',      // 同级目录导入
            'index',        // index 文件
            'object',       // 对象导入
            'type'          // TypeScript 类型导入
          ],
          pathGroups: [
            {
              pattern: '@/**',  // 项目别名导入
              group: 'internal'
            }
          ],
          pathGroupsExcludedImportTypes: ['type'],
          'newlines-between': 'always',
          alphabetize: {
            order: 'asc',
            caseInsensitive: true
          }
        }
      ],
      // 禁止未使用的导入
      'import/no-unused-modules': 'off',
      // 禁止使用默认导出名称作为命名导入
      'import/no-named-as-default': 'off',
      // 确保所有导入都在文件顶部
      'import/first': 'error',
      // 禁止重复导入
      'import/no-duplicates': 'error',
      // 确保所有导入都可以解析
      'import/no-unresolved': 'off' // 如果没有使用 TypeScript 可以关闭
    }
  },
  {
    // 为使用自动导入的 Vue 文件添加配置
    files: ['**/*.vue'],
    languageOptions: {
      globals: {
        // Vue Composition API 全局函数
        ref: 'readonly',
        reactive: 'readonly',
        computed: 'readonly',
        watch: 'readonly',
        watchEffect: 'readonly',
        nextTick: 'readonly',
        onMounted: 'readonly',
        onUnmounted: 'readonly',
        onUpdated: 'readonly',
        onBeforeMount: 'readonly',
        onBeforeUnmount: 'readonly',
        onBeforeUpdate: 'readonly',
        provide: 'readonly',
        inject: 'readonly',
        defineProps: 'readonly',
        defineEmits: 'readonly',
        defineExpose: 'readonly',
        withDefaults: 'readonly'
      }
    }
  },
  // 将Vue essential配置移到此处，并覆盖其中的multi-word-component-names规则
  ...pluginVue.configs['flat/essential'].map((config) => {
    if (config.rules) {
      // 禁用组件名必须为多单词的规则
      config.rules['vue/multi-word-component-names'] = 0
    }
    return config
  })
])
